package br.com.dbsti.pedido;

import java.io.Serializable;
import java.math.BigDecimal;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.IdClass;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;

@Entity
@IdClass(ItemPedido.ID.class)
@Table(uniqueConstraints = {
    @UniqueConstraint(columnNames = {"pedido", "produto"})
})
public class ItemPedido implements Serializable {

    public static class ID implements Serializable {

        @ManyToOne(fetch = FetchType.EAGER)
        @JoinColumn(name = "pedido")
        private Pedido pedido;
        @Column(length = 3)
        private Integer sequencia;

        @Override
        public boolean equals(Object obj) {
            if (obj instanceof ID) {
                ID i = (ID) obj;
                return new EqualsBuilder().append(this.pedido, i.pedido).append(this.sequencia, i.sequencia).isEquals();
            }
            return false;
        }

        @Override
        public int hashCode() {
            return new HashCodeBuilder().append(this.pedido).append(this.sequencia).toHashCode();
        }
    }
    
    @Id
    private Pedido pedido;
    @Id
    private Integer sequencia;
    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name = "produto")
    private Produto produto;
    @Column(precision = 14, scale=4)
    private BigDecimal quantidade;
    @Column(precision = 14, scale=4)
    private BigDecimal precoUnitario;
    @Column(precision = 14, scale=2)
    private BigDecimal precoTotal;

    @Override
    public boolean equals(Object obj) {
        if (obj instanceof ItemPedido) {
            ItemPedido i = (ItemPedido) obj;
            return new EqualsBuilder().append(this.pedido, i.pedido)
                    .append(this.sequencia, i.sequencia).isEquals();
        }
        return false;
    }

    @Override
    public int hashCode() {
        return new HashCodeBuilder().append(this.pedido).append(this.sequencia).toHashCode();
    }

    public Pedido getPedido() {
        return pedido;
    }

    public void setPedido(Pedido pedido) {
        this.pedido = pedido;
    }

    public BigDecimal getPrecoTotal() {
        return precoTotal;
    }

    public void setPrecoTotal(BigDecimal precoTotal) {
        this.precoTotal = precoTotal;
    }

    public BigDecimal getPrecoUnitario() {
        return precoUnitario;
    }

    public void setPrecoUnitario(BigDecimal precoUnitario) {
        this.precoUnitario = precoUnitario;
    }

    public Produto getProduto() {
        return produto;
    }

    public void setProduto(Produto produto) {
        this.produto = produto;
    }

    public BigDecimal getQuantidade() {
        return quantidade;
    }

    public void setQuantidade(BigDecimal quantidade) {
        this.quantidade = quantidade;
    }

    public Integer getSequencia() {
        return sequencia;
    }

    public void setSequencia(Integer sequencia) {
        this.sequencia = sequencia;
    }
}
